home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
MCASM.RAR
/
MC_ASM.EXE
/
WROX_ASM
/
CH12
/
COMMON
/
PALSORT.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1994-09-24
|
2KB
|
72 lines
/************************************************************************/
/* This header contains implementation of sorting procedures */
/* */
/* E.Podvoysky from ^Z for WROX press book, 1994 */
/************************************************************************/
#include <mem.h>
#include "palsort.h"
less_func *less;
ptr_array pointer_array;
void sort(int l, int r) {
int i, j;
void *x, *y;
i = l;
j = r;
x = pointer_array[(l + r) >> 1]; // middle of array
do {
while (less(pointer_array[i], x)) i++;
while (less(x, pointer_array[j])) j--;
if (i <= j) { // sic! , let i become > j!
y = pointer_array[i]; // swap pointers with indexes i and j
pointer_array[i] = pointer_array[j];
pointer_array[j] = y;
i++;
j--;
}
} while (i <= j);
if (l < j) sort(l, j);
if (i < r) sort(i, r);
}
void quicksort( ptr_array ptrarr, less_func less_fun, int l, int r) {
pointer_array = ptrarr;
less = less_fun;
sort( l,r);
}
BOOL long_less(void *p1, void *p2) {
return *((long *)p1) < *((long *)p2);
}
void sort_palette_bright( BGRpalette &pal, int colors) {
long *values;
int j,num;
long **pointers;
BGRpalette *tmp;
values = new long[256];
pointers = new long * [256];
for (j = 0; j < 256; j++) values[j] =
(pal[j].r * 299L + pal[j].g * 587L + pal[j].b * 114L );
for (j = 0; j < 256; j++) pointers[j] = values+j;
quicksort( (ptr_array) pointers, long_less, 0, colors-1);
tmp = new BGRpalette[1];
for (j = 0; j < colors-1; j++) {
num = pointers[j] - values;
(*tmp)[j] = pal[num];
}
memcpy(&pal, tmp, sizeof(BGRcolortype)*colors);
delete tmp;
delete values;
delete pointers;
};